package org.opennaas.extensions.vrf.utils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonToken; import org.codehaus.jackson.map.MappingJsonFactory; import org.opennaas.extensions.vrf.model.VRFRoute; import org.opennaas.extensions.vrf.model.topology.Edge; import org.opennaas.extensions.vrf.model.topology.TopologyInfo; import org.opennaas.extensions.vrf.model.topology.Vertex; /** * * @author Josep Batallé <josep.batalle@i2cat.net> */ public class UtilsTopology { /** * Read the json file that contains the topology and store the nodes and * edges in the global variables. * @param topologyFilename * @param dijkstraCost * @return */ public static TopologyInfo createAdjacencyMatrix(String topologyFilename, int dijkstraCost) { List<Vertex> nodes = new ArrayList<Vertex>(); List<Edge> edges = new ArrayList<Edge>(); try { JsonFactory f = new MappingJsonFactory(); JsonParser jp = f.createJsonParser(new File(topologyFilename)); JsonToken current = jp.nextToken(); if (current != JsonToken.START_OBJECT) { Logger.getLogger(UtilsTopology.class.getName()).log(Level.SEVERE, null, "Error: root should be object: quiting."); } while (jp.nextToken() != JsonToken.END_OBJECT) { String fieldName = jp.getCurrentName(); current = jp.nextToken();// move from field name to field value if (fieldName.equals("nodes")) { if (current == JsonToken.START_ARRAY) { while (jp.nextToken() != JsonToken.END_ARRAY) { JsonNode node = jp.readValueAsTree(); int type; if (node.get("type").getValueAsText().equals("sw")) { type = 0; } else { type = 1; } Vertex v = new Vertex(node.get("id").getValueAsText(), node.get("dpid").getValueAsText(), type); nodes.add(v); } } else { jp.skipChildren(); } } else if (fieldName.equals("links")) { if (current == JsonToken.START_ARRAY) { // For each of the records in the array while (jp.nextToken() != JsonToken.END_ARRAY) { JsonNode link = jp.readValueAsTree(); String srcId = link.get("source").getValueAsText(); String dstId = link.get("target").getValueAsText(); int srcPort = Integer.parseInt(link.get("srcP").getValueAsText()); int dstPort = Integer.parseInt(link.get("dstP").getValueAsText()); Vertex srcV = null; Vertex dstV = null; for (Vertex v : nodes) { if (v.getId().equals(srcId)) { srcV = new Vertex(v.getId(), v.getDPID(), v.getType()); } else if (v.getId().equals(dstId)) { dstV = new Vertex(v.getId(), v.getDPID(), v.getType()); } } Edge e = new Edge(link.get("id").getValueAsText(), srcV, dstV, dijkstraCost, srcPort, dstPort); edges.add(e); e = new Edge(link.get("id").getValueAsText() + "-", dstV, srcV, dijkstraCost, dstPort, srcPort); edges.add(e); } } else { jp.skipChildren(); } } else { jp.skipChildren(); } } } catch (IOException ex) { Logger.getLogger(UtilsTopology.class.getName()).log(Level.SEVERE, null, ex); } TopologyInfo topoInfo = new TopologyInfo(nodes, edges); return topoInfo; } public static List<VRFRoute> moveValueAtIndexToEnd(List<VRFRoute> arrayToBeShifted, int index) { VRFRoute valueBeingMoved = arrayToBeShifted.get(index); for (int i = index; i < arrayToBeShifted.size() - 1; i++) { arrayToBeShifted.set(i, arrayToBeShifted.get(i + 1)); } arrayToBeShifted.set(arrayToBeShifted.size() - 1, valueBeingMoved); return arrayToBeShifted; } }